#include <stdio.h>

//实验二

//分段函数
// int main()
// {
// 	double x, y;
// 	scanf("%lf", &x);
// 	if (x==5)
// 		y=1/(x+5);
// 	else 
// 		y=x;
// 	printf("%.1lf\n", y);
// 	return 0;
// }

//面积与周长(如果可以构成三角形)
// #include <stdio.h>
// #include <math.h>
// int main()
// {
// 	int a, b, c;
// 	double s, p;
// 	scanf("%d%d%d", &a, &b, &c);
//  if ((a+b>c)&&(b+c>a)&&(a+c>b))
//     {
//         p=(a+b+c)/2.0;
// 		s=sqrt(p*fabs(p-a)*fabs(p-b)*fabs(p-c));
// 		printf("%.2f %.2f", s, 2*p);
//     }
// 	else 
// 		printf("Not a Valid Triangle\n");
// 	return 0;
// }


//判断一个整数能否同时被3和7整除
// int main ()
// {
//     int x;
//     scanf ("%d",&x);
//     if (x%3==0 && x%7==0)
//         printf ("Yes\n");
//     else 
//         printf ("No\n");
//     return 0;
// }

//网购运费
// int main ()
// {
//     float w,p;
//     scanf ("%f",&w);
//     if (w<=2)
//         p=7.5;
//     else
//         p=(w-2)*1.8+7.5;
//     printf ("%.1f\n",p);
//     return 0;
// }

//判断字符类型
// int main ()
// {
//     char c;
//     scanf ("%c",&c);
//     //字母
//     if (c>='A'&&c<='z' || c>='a'&&c<='z')
//         printf ("Letter\n");
//     //数字
//     else if (c>='0'&&c<='9')
//         printf ("Digit\n");
//     //其他
//     else
//         printf ("Other\n");

//     return 0;
// }

//三角形类型
// int main ()
// {
//     int a,b,c;
//     scanf ("%d%d%d",&a,&b,&c);
// 	if ((a+b>c)&&(b+c>a)&&(a+c>b))
//     {
//         //等边
//         if (a==b&&a==c)
//             printf ("Equilateral Triangle\n");
//         //等腰
//         else if (a==b||a==c||b==c)
//             printf ("Isosceles Triangle\n");
//         //其他
//         else
//             printf ("Scalene Triangle\n");
//     }
//     else 
//         printf ("No Triangle\n");
//     return 0;
// }

//竞赛获奖
// int main ()
// {
//     int w,c,f,t;
//     scanf ("%d%d%d",&w,&c,&f);
//     t=w+c+f;//总成绩
//     if (t>=285)
//         printf ("Gold Medal\n");
//     else if (t>=270 && t<=284)
//         printf ("Silver Medal\n");
//     else if (t>=240 && t<=269)
//         printf ("Bronze Medal\n");
//     else if (w>=95||c>=95||f>=95)
//         printf ("Honor Medal\n");
//     else 
//         printf ("No Medal\n");

//     return 0;
// }

//计算油费
// int main ()
// {
//     int n,t;
//     char s;
//     float x,y;
//     scanf ("%d%d %c",&n,&t,&s);
//     switch (t)
//     {
//         case 89: y=6.17; break;
//         case 92: y=5.58; break;
//         case 95: y=5.58;
//     }
//     if (s=='a')
//         x=0.95;
//     else
//         x=0.98;
//     printf ("%.2f\n",n*x*y);
//     return 0;
// }

//实验3
//n项累加和
// int main()
// {
// 	int i, n, sum=0;
// 	scanf("%d", &n);
// 	for (i=1;i<=n;i++)
// 		sum=sum+i;
// 	printf("sum=%d\n", sum);
// 	return 0;
// }

//e的近似值
// int main()
// {
// 	double e,t;
// 	int i, n;
// 	scanf("%d", &n);
//     e=1;
//     t=1;
// 	for (i=1; i<=n; i++)
//     {
// 		t=t*i;
// 		e=e+1.0/t;
// 	}
// 	printf("%.8lf\n", e);
// 	return 0;
// }

//整除求和
//输出1~n之间能被3整除、但不能被7整除的所有整数之和。
// int main ()
// {
//     int n,i,sum=0;
//     scanf ("%d",&n);
//     for (i=1;i<=n;i++)
//     {
//         if (i%3==0&&i%7!=0)
//             sum+=i;
//     }
//     printf ("%d\n",sum);
//     return 0;
// }


//完数判断
//完全数是指它所有的真因子（即除了自身以外的正因子）的和恰好等于它本身。
// int main ()
// {
//     int n,i,sum=0;
//     scanf ("%d",&n);
//     for (i=1;i<n;i++)
//     {
//         if (n%i==0)
//             sum+=i;
//     }
//     if (sum==n)
//         printf ("Yes\n");
//     else
//         printf ("No\n");
//     return 0;
// }

//斐波那契数列
// int main ()
// {
//     int n,i,a=1,b=1,c;
//     scanf ("%d",&n);
//     if (n<3)
//         c=1;
//     for (i=2;i<n;i++)
//     {
//         c=a+b;
//         a=b;
//         b=c;
//     }
//     printf ("%d\n",c);
//     return 0;
// }

//最小公倍数
// int main ()
// {
//     int m,n,t=1,x;
//     scanf ("%d%d",&m,&n);
//     int p=m*n;
//     while (t)
//     {
//         t=m%n;
//         m=n;
//         n=t;
//     }
//     printf ("%d\n",p/m);
//     return 0;
// }

//选手得分
// int main ()
// {
//     int n,i,score[100],sum=0;
//     double s=0;
//     scanf ("%d",&n);
//     for (i=0;i<n;i++)
//         scanf ("%d",&score[i]);
//     //找最大值和最小值
//     int max=0,min=100;
//     for (i=0;i<n;i++)
//     {
//         if (score[i]>max)
//             max=score[i];
//         if (score[i]<min)
//             min=score[i];
//         sum+=score[i];
//     }
//     s=(sum-max-min)/(double)(n-2);
//     printf ("%.1lf\n",s);
//     return 0;
// }

//素数统计
// #include <math.h>
// int main ()
// {
//     int m,n,count=0,i,j,flag;
//     scanf ("%d%d",&m,&n);
//     for (i=m;i<=n;i++)
//     {
//         flag=1;
//         for (j=2;j<=sqrt(i);j++)
//         {
//             if (i%j==0)
//                 flag=0;
//         }
//         if(flag==1)
//             count++;
//     }
//     printf ("%d\n",count);
//     return 0;
// }

//实验4
//筛选数组a中能被3整除的元素
// int main ()
// {
//     int a[10],i;
//     for (i=0;i<10;i++)
//     {
//         scanf ("%d",a+i);
//         if (a[i]%3==0)
//             printf ("%d ",a[i]);
//     }
//     printf ("\n");
//     return 0;
// }

//插入元素
// int main ()
// {
//     int a[20]={12,64,7,66,96,76,67,61,13,16};
//     int n,x,i;
//     scanf ("%d%d",&n,&x);
//     for (i=9;i>=n;i--)
//         a[i+1]=a[i];
//     a[n]=x;
//     for (i=0;i<11;i++)
//         printf ("%d ",a[i]);
//     return 0;
// }

//最小值与位置
// int main ()
// {
//     int n,a[100],i,min,t;
//     scanf ("%d",&n);
//     for (i=0;i<n;i++)
//         scanf ("%d",&a[i]);
//     min=a[0];
//     for (i=0;i<n;i++)
//         if (a[i]<=min)
//         {
//             min=a[i];
//             t=i;
//         }
//     printf ("%d %d\n",min,t);
//     return 0;
// }

//查找整数
// int main ()
// {
//     int n,x,i,a[100],flag=0;
//     scanf ("%d%d",&n,&x);
//     for (i=0;i<n;i++)
//         scanf ("%d",&a[i]);
//     for (i=0;i<n;i++)
//         if (a[i]==x)
//         {
//             printf ("%d\n",i);
//             flag=1;
//         }
//     if (flag==0)
//         printf ("-1\n");
//     return 0;
// }

//绝对偏差
// #include <math.h>
// int main ()
// {
//     int n,i,a[100];
//     double ave,sum;
//     scanf ("%d",&n);
//     for (i=0;i<n;i++)
//     {
//         scanf ("%d",&a[i]);
//         sum+=a[i];
//     }
//     ave=sum/n;
//     int max=0,t=0;
//     for (i=0;i<n;i++)
//     {
//         if (fabs(a[i]-ave)>max)
//         {
//             max=fabs(a[i]-ave);
//             t=a[i];
//         }
//     }
//     printf ("%d\n",t);
//     return 0;
// }

//排序算法
// int main ()
// {
//     int n,i,j,t,a[100];
//     scanf ("%d",&n);
//     for (i=0;i<n;i++)
//         scanf ("%d",&a[i]);
//     for (i=0;i<n-1;i++)
//     {
//         for (j=0;j<n-i-1;j++)
//         {
//             if (a[j]<a[j+1])
//             {
//                 t=a[j];
//                 a[j]=a[j+1];
//                 a[j+1]=t;
//             }
//         }
//     }
//     for (i=0;i<n;i++)
//         printf ("%d ",a[i]);    
//     return 0;
// }

//统计次数
// int main ()
// {
//     int n,i,j,t,max=0,num,a[100];
//     scanf ("%d",&n);
//     for (i=0;i<n;i++)
//         scanf ("%d",&a[i]);
//     for (i=0;i<n;i++)
//     {
//         t=0;
//         for (j=i;j<n;j++)
//         {
//             if (a[i]==a[j])
//                 t++;
//         }
//         if (t>max)
//         {
//             max=t;
//             num=a[i];
//         }
//     }
//     printf ("%d %d\n",num,max);
//     return 0;
// }

//找中位数
// int main ()
// {
//     int n,i,j,t,a[100];
//     scanf ("%d",&n);
//     for (i=0;i<n;i++)
//         scanf ("%d",&a[i]);
//     for (i=0;i<n-1;i++)
//         for (j=0;j<n-i-1;j++)
//             if (a[j]<a[j+1])
//             {
//                 t=a[j];
//                 a[j]=a[j+1];
//                 a[j+1]=t;
//             }
//     float num;
//     if (n%2==0)
//         num=(a[n/2]+a[n/2-1])/2.0;
//     else
//         num=(float)a[n/2];
//     printf ("%.1f\n",num);
//     return 0;
// }


//实验5
//矩阵各列之和
// int main ()
// {
//     int m,n,a[20][20],i,j,sum;
//     scanf ("%d%d",&m,&n);
//     for (i=0;i<m;i++)
//         for (j=0;j<n;j++)
//             scanf ("%d",&a[i][j]);
//     for (j=0;j<n;j++)
//     {
//         sum=0;
//         for (i=0;i<m;i++)
//             sum+=a[i][j];
//         printf ("%d ",sum);
//     }
//     return 0;
// }

//删除字符
// int main ()
// {
//     char s[100];
//     int i,j;
//     while ((s[i]=getchar())!='\n') i++;
//     s[i]='\0';
//     //gets(s);
//     for (i=0,j=0;s[i]!='\0';i++)
//         if(s[i]>='0' && s[i]<='9')
//         {
//             s[j]=s[i];
//             j++;
//         }
//     s[j]='\0';
//     for (i=0;s[i]!='\0';i++)
//         putchar(s[i]);
//     //puts(s);
//     return 0;
// }

// #include <stdio.h>
// #include<string.h>
// int main()
// {
// 	int i, j,n;
//     char a[100];
//     gets(a);
//     n=strlen(a);
//     for(i=0;i<n;i++)
//     {
//        if(a[i]>='0'&&a[i]<='9')
//        printf("%c",a[i]);
// 	}
// 	return 0;
// }

//矩阵次对角线之和
// int main ()
// {
//     int i,j,a[5][5],sum=0;
//     for (i=0;i<5;i++)
//         for (j=0;j<5;j++)
//             scanf ("%d",&a[i][j]);
//     for (i=0,j=4;i<5;i++,j--)
//         sum+=a[i][j];
//     printf ("%d\n",sum);
//     return 0;
// }

//矩阵排序
// int main ()
// {
//     int m,n,a[20][20],i,j,k,t;
//     scanf ("%d%d",&m,&n);
//     for (i=0;i<m;i++)
//         for (j=0;j<n;j++)
//             scanf ("%d",&a[i][j]);
//     for (j=0;j<n;j++)
//     {
//         for (i=0;i<m-1;i++)
//         {
//             for (k=0;k<m-1;k++)
//             {
//                 if (a[k][j]<a[k+1][j])
//                 {
//                     t=a[k][j];
//                     a[k][j]=a[k+1][j];
//                     a[k+1][j]=t;
//                 }
//             }
//         }
//     }
//     for (i=0;i<m;i++)
//     {
//         for (j=0;j<n;j++)
//             printf ("%d ",a[i][j]);
//         printf ("\n");
//     }
//     return 0;
// }

//判断上三角矩阵
// int main ()
// {
//     int n,a[20][20],i,j,flag=1;
//     scanf ("%d",&n);
//     for (i=0;i<n;i++)
//         for (j=0;j<n;j++)
//             scanf ("%d",&a[i][j]);
//     for (i=1;i<n;i++)
//         for (j=0;j<i;j++)
//             if (a[i][j]!=0)
//             {
//                 flag=0;
//                 break;
//             }
//     if (flag==1)
//         printf ("Yes\n");
//     else
//         printf ("No\n");
//     return 0;
// }

//查找指定字符
// int main ()
// {
//     char c,s[100];
//     int i=0,t=-1;
//     c=getchar();
//     getchar();
//     while ((s[i]=getchar())!='\n') i++;
//     for (i=0;s[i]!='\0';i++)
//         if (c==s[i])
//             t=i;
//     if (t==-1)
//         printf ("Not Found\n");
//     else
//         printf ("%d\n",t);
//     return 0;
// }

//方阵循环右移
// int main ()
// {
//     int m,n,a[20][40],i,j;
//     scanf ("%d%d",&m,&n);
//     for (i=0;i<n;i++)
//         for (j=0;j<n;j++)
//         {
//             scanf ("%d",&a[i][j]);
//             a[i][j+n]=a[i][j];
//         }
//     for (i=0;i<n;i++)
//     {
//         for (j=n-(m%n);j<2*n-(m%n);j++)
//             printf ("%d ",a[i][j]);
//         printf ("\n"); 
//     }
//     return 0;
// }

//字符串加密
int main ()
{
    int key,i=0;
    char s[100];
    scanf ("%d",&key);
    getchar();
    while ((s[i]=getchar())!='\n') i++;
    s[i]='\0';
    for(i--;i>=0;i--)
    {
        if (s[i]>='A'&&s[i]<='Z')
            s[i] = ((s[i] - 'A' + key) % 26) + 'A';
        // {
        //     s[i]+=key;
        //     while (s[i]>'Z')
        //         s[i]-=26;
        // }
        else if (s[i]>='a'&&s[i]<='z')
            s[i] = ((s[i] - 'a' + key) % 26) + 'a';
        // {
        //     s[i]+=key;
        //     if (s[i]>'z')
        //         s[i]-=26;
        // }
    }
    printf ("%s\n",s);
    return 0;
}

